home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
scope
/
051-075
/
scopedisk75
/
ispell
/
src
/
amiga.c
next >
Wrap
C/C++ Source or Header
|
1995-03-19
|
8KB
|
424 lines
/* -*- Mode:Text -*- */
/*
* Deal w/ amiga console screen stuff.
*
* -- luis soltero, 5/12/88 --
*
*
*/
#include <stdio.h>
#include <fcntl.h>
/*------------------------------------------------------------------------
* amiga console suport routines
*/
#include <exec/types.h>
#include <exec/exec.h>
#include <intuition/intuition.h>
#include <graphics/gfx.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
/* console colors */
#define WHITE_ON_BLACK 0
#define WHITE_ON_BLUE 1
#define BLACK_ON_WHITE 2
#define BLUE_ON_WHITE 3
#define ORANGE_ON_BLUE 4
#define SETCOLORS(k,x) (setcolors(k, colors[x].style, colors[x].frw, colors[x].bak))
struct colortype {
char *style;
char *frw;
char *bak;
} colors[5] = {
{"0", "31", "42"}, /* white on black */
{"0", "31", "40"}, /* white on blue */
{"0", "32", "41"}, /* black on white */
{"0", "30", "41"}, /* blue on white */
{"0", "33", "40"} /* orange_on_blue */
};
insert_line(rq)
struct IOStdReq *rq;
{
printc(rq,"%c%c",0x9b, 0x4c);
}
scroll_up(rq, nl)
struct IOStdReq *rq;
int nl;
{
char buf[10];
sprintf(buf,"%d",(short)nl);
printc(rq,"%c%s%c",0x9b, buf, 0x53);
}
scroll_down(rq, nl)
struct IOStdReq *rq;
int nl;
{
char buf[10];
sprintf(buf,"%d",(short)nl);
printc(rq,"%c%s%c",0x9b, buf, 0x54);
}
cursor_off(rq)
struct IOStdReq *rq;
{
printc(rq,"%c%c%c%c",0x9b,0x30,0x20,0x70);
}
cursor_on(rq)
struct IOStdReq *rq;
{
printf(rq,"%c%c%c",0x9b,0x20,0x70);
}
beep(rq)
struct IOStdReq *rq;
{
printc(rq,"%c",0x7);
}
con_set_line(rq,offset,len)
struct IOStdReq *rq;
int offset, /* in raster col, dist from left of win */
len; /* number of chars */
{
char buf[10];
sprintf(buf,"%d",(short)offset);
printc(rq,"%c%s%c",0x9b,buf,0x78);
sprintf(buf,"%d",(short)len);
printc(rq,"%c%s%c",0x9b,buf,0x75);
}
con_set_pagelen(rq)
struct IOStdReq *rq;
{
printc(rq,"%c%c",0x9b,0x74);
}
Open_Console(rq,win)
struct IOStdReq *rq;
struct Window *win;
{
rq->io_Data = (APTR) win;
rq->io_Length = sizeof(*win);
if (OpenDevice("console.device",0,rq,0))
return(FALSE); /* could not get device */
return(TRUE); /* device opened successfully */
}
GotoXY(rq,x,y)
struct IOStdReq *rq;
ULONG x,y;
{
char buf[10];
sprintf(buf,"%c%d%c%d%c",0x9b,y,0x3b,x,0x48);
putcon(rq,buf);
}
ClrScr(rq)
struct IOStdReq *rq;
{
char buf[10];
sprintf(buf,"%c",0x0c);
putcon(rq,buf);
}
setcolors(rq,style,fg,bg)
struct IOStdReq *rq;
char *style, *fg, *bg;
{
char buf[10];
sprintf(buf,"%c%s%c%s%c%s%c",0x9b,style,0x3b,fg,0x3b,bg,0x6d);
putcon(rq,buf);
}
putcon(rq,str)
struct IOStdReq *rq;
char *str;
{
/* in case the console has not been initialized */
if ( rq == NULL ) {
fprintf(stderr,"%s",str);
return;
}
rq->io_Command = CMD_WRITE;
rq->io_Data = (APTR) str;
rq->io_Length = -1;
DoIO(rq);
}
printc(rq,fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)
struct IOStdReq *rq;
ULONG fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12;
{
char pbuff[256];
sprintf(pbuff,fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12);
putcon(rq,pbuff);
}
struct NewWindow NewWin = {
0, 0, /* left, top edge */
0, 0, /* width, hight */
0, 1, /* detail, block pen */
CLOSEWINDOW | NEWSIZE, /* IDCMP flags */
SMART_REFRESH | ACTIVATE | /* flags */
WINDOWCLOSE | WINDOWDRAG |
WINDOWSIZING | WINDOWDEPTH |
GIMMEZEROZERO,
NULL, NULL, /* gadget, check mark */
NULL, /* title */
NULL, NULL, /* screen, bitmap */
200, 15, /* min width, min height */
640, 200, /* max width, max height */
WBENCHSCREEN /* type */
};
Make_Window(w_ptr, title, x0, y0, x1, y1)
struct Window **w_ptr;
UBYTE *title;
int x0,y0,x1,y1; /* upper left & lower right corners */
{
struct Window *OpenWindow();
/* define the window in Amiga Intuition terms */
NewWin.LeftEdge = x0;
NewWin.TopEdge = y0;
NewWin.Width = (x1 - x0);
NewWin.Height = (y1 - y0);
NewWin.Title = title;
if ((*w_ptr = OpenWindow(&NewWin)) == NULL)
return(FALSE); /* problem... return false */
return(TRUE); /* window opened okay... return true */
} /* Make_Window() */
struct IntuitionBase *IntuitionBase;
/* open a 25x80 nondescript win to scroll text in */
init_win(ApplWin, applname, ApplIOrq)
struct Window **ApplWin;
char *applname;
struct IOStdReq *ApplIOrq;
{
struct IntuitionBase *OpenLibrary();
struct GfxBase *gfb;
IntuitionBase = OpenLibrary("intuition.library",LIBRARY_VERSION);
if (IntuitionBase == NULL)
exit(FALSE);
gfb = (struct GfxBase *)OpenLibrary("graphics.library",LIBRARY_VERSION);
if (gfb == NULL)
exit(FALSE);
if (!(Make_Window(ApplWin,applname,0L,0L,640L,200L)))
exit (FALSE);
ModifyIDCMP((*ApplWin), CLOSEWINDOW | NEWSIZE | ACTIVEWINDOW |
VANILLAKEY | MENUPICK);
if (! Open_Console(ApplIOrq,(*ApplWin) )){
CloseWindow((*ApplWin));
exit(FALSE);
}
con_set_line(ApplIOrq,0,130);
SETCOLORS(ApplIOrq,WHITE_ON_BLACK);
}
/* terminate win opened by init_win() */
close_win(ApplWin, ApplIOrq)
struct Window *ApplWin;
struct IOStdReq *ApplIOrq;
{
CloseWindow(ApplWin);
CloseDevice(ApplIOrq);
}
/* get input from user and tokenize it */
getevent(ApplWin)
struct Window *ApplWin;
{
struct IntuiMessage *mess, *GetMsg();
int retval = -1;
/* wait for an intuition event */
while( !(mess = GetMsg(ApplWin->UserPort)) )
Wait(1 << ApplWin->UserPort->mp_SigBit);
switch(mess->Class) {
case CLOSEWINDOW:
retval = 'q';
break;
case VANILLAKEY:
retval = mess->Code;
break;
case NEWSIZE :
retval = 0x0c;
break;
case MENUPICK:
case ACTIVEWINDOW:
default:
break;
}
ReplyMsg(mess);
return(retval);
}
/*
* end of amiga console support.
*-----------------------------------------------------------------------*/
/*-------------------------------------------------------------------------
* terminal handling entry points
*/
#include <sgtty.h>
#include <signal.h>
#include "ispell.h"
struct Window *scr_w = NULL;
struct IOStdReq *scr_rq = NULL, _scr_rq;
printcon(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)
ULONG fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12;
{
char pbuff[256];
sprintf(pbuff,fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12);
putcon(scr_rq, pbuff);
}
putccon(ch)
char ch;
{
printc(scr_rq,"%c", ch);
}
getccon()
{
int ch;
while ( (ch=getevent(scr_w)) == -1 )
;
if ( ch == '\b' || ch == 0x7f )
erasechar = ch;
return( ch );
}
/* open a console window for spell */
terminit ()
{
erasechar = '\b';
scr_rq = &_scr_rq;
init_win(&scr_w, "ISpell", scr_rq);
}
done ()
{
unlink(tempfile);
close_win(scr_w, scr_rq);
exit(0);
}
/* clear the screen */
erase ()
{
ClrScr(scr_rq);
}
/* move to row, col */
move (row, col)
{
GotoXY(scr_rq, col, row);
}
/* do stand out mode */
inverse ()
{
SETCOLORS(scr_rq, ORANGE_ON_BLUE);
}
/* do stand end mode */
normal ()
{
SETCOLORS(scr_rq, WHITE_ON_BLACK);
}
/* do a back space */
backup ()
{
putch((int)'\b');
}
putch (c)
{
printc (scr_rq,"%c", c);
}
/* not implemented on the amiga */
onstop(signo) {}
stop () {}
#define CLI "NewCli"
#define CLINAME "\"con:20/30/600/100/ISpell Cli\""
shellescape (buf)
char *buf;
{
fexecl(CLI,CLI,CLINAME,0);
}
/*
* end of terminal control entry points
*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------
* misc missing and broken stuff.
*
*/
/* the manx access routine is broken, here is a brain damaged one
that works for this applications. */
access(name)
char *name;
{
int in = open(name, O_RDWR);
if ( in == -1 )
return( -1 );
close (in);
return(0);
}
/* i really do not understant why sleep is used in i spell. Here is
a null function used soley to keep ispell happy. */
sleep(n) int n; {}
link(from, to)
char *from, *to;
{
FILE *f, *t;
int ch;
if ( (f=fopen(from,"r")) == NULL )
return(-1);
if ( (t=fopen(to,"w")) == NULL ) {
fclose(f);
return(-1);
}
while((ch=getc(f)) != EOF )
putc(ch, t);
fclose(f);
fclose(t);
}